// 二次封装axios
import axios from 'axios'
import { ElMessage } from 'element-plus'
import { ElMessageBox } from 'element-plus'
//引入用户相关的仓库
import useUserStore from '@/store/modules/user.ts'

//利用axios二次封装：使用请求与响应拦截器
const request = axios.create({
  //基础路径
  baseURL: import.meta.env.VITE_APP_BASE_API,
  timeout: 5000, //超时的时间设置
})

//request实例添加请求与响应拦截器
request.interceptors.request.use(
  (config) => {
    const userStore = useUserStore()
    //mock数据
    if (userStore.token) {
      config.headers.token = userStore.token
    }

    //config配置对象，headers属性请求头，经常给服务器端携带公共参数
    return config
  },
  (error) => {
    return Promise.reject(error)
  },
)

//响应拦截器
request.interceptors.response.use(
  //成功回调
  (response) => {
    const res = response.data
    const status = res.code
    if (status !== 20000) {
      let message = ''
      switch (status) {
        // 401: 未登录
        // 未登录则跳转登录页面，并携带当前页面的路径
        // 在登录成功后返回当前页面，这一步需要在登录页操作。
        case 20401:
          message = '未登录'
          break
        // 403 token过期
        // 登录过期对用户进行提示
        // 清除本地token和清空vuex中token对象
        // 跳转登录页面
        case 50008 || 50012 || 50014:
          message = '登录已过期，请重新登录'
          break
        case 404:
          message = '网络请求不存在'
          break
        case 500:
          message = '服务器出现问题'
          break
        default:
          message = res.message
          break
      }

      ElMessage({
        type: 'error',
        message,
      })
      if (status === 50008 || status === 50012 || status === 50014) {
        setTimeout(() => {
          ElMessageBox.confirm(message, '提示', {
            distinguishCancelAndClose: true,
            confirmButtonText: '确定',
            cancelButtonText: '取消',
          }).then(() => {
            //跳转登录页
          })
        }, 3000)
      }
      return Promise.reject(response.data)
    } else {
      return res
    }
  },

  //失败回调
  (error) => {
    //请求接口失败后提示
    ElMessage({
      type: 'error',
      message: error.message,
    })
    return Promise.reject(error)
  },
)

export default request
